import { Ref, ref, computed } from 'vue'

/**
 * 排序信息接口
 * @template T 排序字段的类型，默认为string
 */
export interface ISortInfo<T = string> {
    /**
     * 当前排序的字段名
     */
    prop: T | null
    
    /**
     * 当前排序方向
     * - 'asc' 升序
     * - 'desc' 降序
     * - null 无排序
     */
    order: 'asc' | 'desc' | null
}

/**
 * 创建表格排序相关逻辑的Composable函数
 * @template T 排序字段的类型，默认为string
 * @param initialProp 初始排序字段
 * @param initialOrder 初始排序方向
 * @returns 返回排序相关状态和方法
 */
export function useTableSort<T extends string = string>(
    initialProp: T | null = null,
    initialOrder: 'asc' | 'desc' | null = null
) {
    // 排序状态ref
    const sortInfo = ref<ISortInfo<T>>({
        prop: initialProp,
        order: initialOrder
    })

    // 表格组件引用
    const tableRef = ref<any>(null)

    /**
     * 处理表格排序变化事件
     * @param param0 排序变化参数
     * @param param0.prop 排序字段
     * @param param0.order 排序方向 ('ascending' | 'descending' | null)
     */
    const handleSortChange = ({ prop, order }: { prop: T; order: string }) => {
        sortInfo.value = {
            prop,
            order: order === 'ascending' ? 'asc' : order === 'descending' ? 'desc' : null
        }
    }

    /**
     * 对数据进行排序
     * @template D 数据项的类型
     * @param data 原始数据数组
     * @returns 排序后的数据数组
     */
    const sortData = <D extends Record<string, any>>(data: D[]) => {
        // 如果没有排序字段或方向，返回原数据
        if (!sortInfo.value.prop || !sortInfo.value.order) return data

        // 创建数据副本并排序
        return [...data].sort((a, b) => {
            const aValue = a[sortInfo.value.prop!]
            const bValue = b[sortInfo.value.prop!]

            // 升序排序
            if (sortInfo.value.order === 'asc') {
                return aValue > bValue ? 1 : aValue < bValue ? -1 : 0
            } 
            // 降序排序
            else {
                return aValue < bValue ? 1 : aValue > bValue ? -1 : 0
            }
        })
    }

    /**
     * 创建计算属性形式的排序数据
     * @template D 数据项的类型
     * @param dataRef 数据ref引用
     * @returns 返回计算属性，自动根据排序状态返回排序后的数据
     */
    const createSortedData = <D extends Record<string, any>>(dataRef: Ref<D[]>) => {
        return computed(() => sortData(dataRef.value))
    }

    /**
     * 重置排序状态
     * - 重置内部排序状态
     * - 清除表格组件的排序UI标识
     */
    const resetSort = () => {
        // 重置内部状态
        sortInfo.value = {
            prop: initialProp,
            order: initialOrder
        }
        
        // 清除表格排序UI标识
        if (tableRef.value) {
            tableRef.value.sort(sortInfo.value.prop, null)
        }
    }

    /**
     * 设置表格组件引用
     * @param ref 表格组件实例引用
     */
    const setTableRef = (ref: any) => {
        tableRef.value = ref
    }

    return {
        sortInfo,
        handleSortChange,
        sortData,
        createSortedData,
        resetSort,
        setTableRef
    }
}